package com.test.controller;


import com.test.service.IsolationTestService;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.annotation.Resource;

/**
 * 隔离级别测试
 * 在Spring事务管理中，隔离级别（Isolation Level）是一个关键概念，它决定了并发事务之间如何彼此隔离。
 * Spring提供了多种隔离级别来控制事务之间的数据可见性和并发性。
 * 要验证隔离级别配置的效果，我们可以设置不同的隔离级别，并通过并发操作来观察事务之间的数据可见性和隔离性。
 * 隔离级别介绍
 * 以下是Spring中常用的隔离级别：
 * DEFAULT：使用底层数据库的默认隔离级别。
 * READ_UNCOMMITTED：最低的隔离级别，允许读取未提交的数据（脏读）。
 * READ_COMMITTED：仅允许读取已提交的数据，防止脏读。
 * REPEATABLE_READ：确保在一个事务内多次读取相同的数据结果一致，防止不可重复读。
 * SERIALIZABLE：最高的隔离级别，完全锁定数据，防止脏读、不可重复读和幻读。
 */
@RestController()
@RequestMapping("isolationTest")
public class IsolationTestController {

    @Resource
    private IsolationTestService isolationTestService;


    @GetMapping("test01")
    public void test01() throws InterruptedException {
        System.out.println("=======controller isolationTest test01=====");
        // 初始化用户余额
        isolationTestService.updateName("first");
        // 创建两个线程，分别执行READ_COMMITTED和REPEATABLE_READ操作
        Thread thread1 = new Thread(() -> isolationTestService.readCommittedOperation());
        Thread thread2 = new Thread(() -> isolationTestService.repeatableReadOperation());

        // 启动线程
        thread1.start();
        thread2.start();

        // 主线程等待2秒，然后更新用户余额
        Thread.sleep(2000);
        isolationTestService.updateName("second");

        // 等待线程执行完毕
        thread1.join();
        thread2.join();
    }

}
